package com.anpy.user.controller;

import com.anpy.common.service.model.vo.ResponseMessage;
import com.anpy.common.service.model.vo.Result;
import com.anpy.user.entity.RoleEntity;
import com.anpy.user.service.RoleService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * 角色管理控制器
 */
@RestController
@RequestMapping("/role")
@Api(tags = "角色管理接口")
public class RoleController {

    @Resource
    private RoleService roleService;

    /**
     * 创建角色
     * @param roleEntity 角色信息
     * @return 创建结果
     */
    @PostMapping("/create")
    @ApiOperation("创建角色")
    public ResponseMessage<Boolean> createRole(@RequestBody @ApiParam("角色信息") RoleEntity roleEntity) {
        // 设置创建时间为当前时间，避免前端传入
        roleEntity.setCreatedAt(new Date());
        return Result.success(roleService.createRole(roleEntity));
    }

    /**
     * 更新角色
     * @param roleEntity 角色信息
     * @return 更新结果
     */
    @PostMapping("/update")
    @ApiOperation("更新角色")
    public ResponseMessage<Boolean> updateRole(@RequestBody @ApiParam("角色信息") RoleEntity roleEntity) {
        return Result.success(roleService.updateRole(roleEntity));
    }

    /**
     * 删除角色
     * @param roleId 角色ID
     * @return 删除结果
     */
    @DeleteMapping("/delete/{roleId}")
    @ApiOperation("删除角色")
    public ResponseMessage<Boolean> deleteRole(@PathVariable @ApiParam("角色ID") Integer roleId) {
        return Result.success(roleService.deleteRole(roleId));
    }

    /**
     * 获取角色详情
     * @param roleId 角色ID
     * @return 角色信息
     */
    @GetMapping("/get/{roleId}")
    @ApiOperation("获取角色详情")
    public ResponseMessage<RoleEntity> getRoleById(@PathVariable @ApiParam("角色ID") Integer roleId) {
        return Result.success(roleService.getRoleById(roleId));
    }

    /**
     * 获取所有角色
     * @return 角色列表
     */
    @GetMapping("/list")
    @ApiOperation("获取所有角色")
    public ResponseMessage<List<RoleEntity>> getAllRoles() {
        return Result.success(roleService.getAllRoles());
    }

    /**
     * 分页查询角色
     * @param page 页码
     * @param size 每页大小
     * @param name 角色名称（可选，用于模糊查询）
     * @param status 状态（可选）
     * @return 分页结果
     */
    @GetMapping("/page")
    @ApiOperation("分页查询角色")
    public ResponseMessage<Page<RoleEntity>> getRolesByPage(
            @RequestParam(defaultValue = "1") @ApiParam("页码") int page,
            @RequestParam(defaultValue = "10") @ApiParam("每页大小") int size,
            @RequestParam(required = false) @ApiParam("角色名称") String name,
            @RequestParam(required = false) @ApiParam("状态") Boolean status) {
        return Result.success(roleService.getRolesByPage(page, size, name, status));
    }

    /**
     * 更新角色状态
     * @param roleId 角色ID
     * @param status 新状态
     * @return 更新结果
     */
    @PostMapping("/status/{roleId}")
    @ApiOperation("更新角色状态")
    public ResponseMessage<Boolean> updateRoleStatus(
            @PathVariable @ApiParam("角色ID") Integer roleId,
            @RequestParam @ApiParam("状态") Boolean status) {
        return Result.success(roleService.updateRoleStatus(roleId, status));
    }

    /**
     * 为角色分配权限
     * @param roleId 角色ID
     * @param permissions 权限列表
     * @return 分配结果
     */
    @PostMapping("/permissions/{roleId}")
    @ApiOperation("为角色分配权限")
    public ResponseMessage<Boolean> assignPermissions(
            @PathVariable @ApiParam("角色ID") Integer roleId,
            @RequestBody @ApiParam("权限列表") List<String> permissions) {
        return Result.success(roleService.assignPermissions(roleId, permissions));
    }

    /**
     * 获取角色的权限列表
     * @param roleId 角色ID
     * @return 权限列表
     */
    @GetMapping("/permissions/{roleId}")
    @ApiOperation("获取角色的权限列表")
    public ResponseMessage<List<String>> getRolePermissions(@PathVariable @ApiParam("角色ID") Integer roleId) {
        return Result.success(roleService.getRolePermissions(roleId));
    }
}
